#ifndef DESIGN_DECORATOR_H_
#define DESIGN_DECORATOR_H_

#include <string>

namespace decorator{

class Beverage
{
public:
    virtual ~Beverage(){}
public:
   virtual std::string getDescription();
   virtual int cost();
protected:
   std::string m_descri;
};

class CondimentDecorator:public Beverage
{
public:
    virtual ~CondimentDecorator(){}
};

////////////////////////////////
class HouseBlend:public Beverage
{
public:
    HouseBlend();
    virtual ~HouseBlend(){}
public:
    virtual std::string getDescription();
    virtual int cost();
};

class DarkRoast:public Beverage
{
public:
    DarkRoast();
    virtual  ~DarkRoast(){}
public:
    virtual std::string getDescription();
    virtual int cost();
};

class Espresso:public Beverage
{
public:
    Espresso();
    virtual ~Espresso(){}
public:
    virtual std::string getDescription();
    virtual int cost();
};

class Decaf:public Beverage
{
public:
    Decaf();
    virtual ~Decaf(){}
public:
    virtual std::string getDescription();
    virtual int cost();
};
////////////////////////////////
class Milk:public CondimentDecorator
{
public:
    Milk(Beverage* b);
    virtual ~Milk(){}
public:
    virtual std::string getDescription();
    virtual int cost();
private:
    Beverage* m_b;
};

class Mocha:public CondimentDecorator
{
public:
    Mocha(Beverage* b);
    virtual ~Mocha(){}
public:
    virtual std::string getDescription();
    virtual int cost();
private:
    Beverage* m_b;
};

class Soy:public CondimentDecorator
{
 public:
    Soy(Beverage* b);
    virtual ~Soy(){}
 public:
    virtual std::string getDescription();
    virtual int cost();
 private:
    Beverage* m_b;
};

class Whip:public CondimentDecorator
{
public:
    Whip(Beverage* b);
    virtual ~Whip(){}
public:
    virtual std::string getDescription();
    virtual int cost();
private:
    Beverage* m_b;
};

}
#endif // DESIGN_DECORATOR_H_
